package packgui;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;

import javax.swing.*;
import javax.swing.GroupLayout.Group;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.DateFormatter;

import packexceptions.DoublonException;
import packmodele.*;

/**
 * Frame affichant les détails d'un produit, et permettant de les modifier.
 * 
 * @author Paulino
 * 
 */
public class FrameDetail extends JFrame
{
	private static final long serialVersionUID = 1L;

	public static final int LARG = 145, LARGJTF = 225, HAUT = 30;

	private JLabel jlTitre, jlPrix, jlRealisateur, jlDateSortie, jlActeurs,
			jlPays, jlFormatAud, jlFormatVid, jlCodeBarre, jlEditeur, jlDuree,
			jlFormat;
	private JTextField jfTitre, jfRealisateur, /* jfDateSortie, */
	jfPays, jfFormatAud, jfFormatVid, jfCodeBarre, jfEditeur, jfFormat;
	private JTextField jfPrix, jfDuree;
	private JFormattedTextField jfDateSortie;
	private JButton jbOk, jbAjouterActeur, jbSupprimerActeur;
	private JList jlsListeActeurs;
	private JScrollPane jspActeurs;
	private JPanel jpdetail, jpBoutonsActeurs;

	private Produit produit;
	private boolean edit;

	public FrameDetail(Produit produit, boolean edit)
	{
		super("Détail du produit");
		this.produit = produit;
		this.edit = edit;
		init();
	}

	public void init()
	{

		if (produit instanceof Dvd)
		{
			this.setSize(410, 600);

			if (edit)
			{
				this.setSize(410, 635);
			}
		}

		if (produit instanceof Affiche)
		{
			this.setSize(410, 420);

			if (edit)
			{
				this.setSize(410, 450);
			}
		}

		if (produit instanceof DossierPresse)
		{
			this.setSize(410, 385);

			if (edit)
			{
				this.setSize(410, 415);
			}
		}
		// this.setResizable(false);

		setLayout(new FlowLayout());

		add(getJpdetail());
		add(getJbOk());

		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}

	public JLabel getJlTitre()
	{
		if (jlTitre == null)
		{
			jlTitre = new JLabel("Titre");
		}
		return jlTitre;
	}

	public JLabel getJlPrix()
	{
		if (jlPrix == null)
		{
			jlPrix = new JLabel("Prix (€)");
		}
		return jlPrix;
	}

	public JTextField getJfTitre()
	{
		if (jfTitre == null)
		{
			jfTitre = new JTextField(produit.getTitre());
			jfTitre.setEditable(false); // non éditable, car risque de doublon
										// si on modifie le titre du produit
		}
		return jfTitre;
	}

	public JTextField getJfPrix()
	{
		if (jfPrix == null)
		{
			jfPrix = new JTextField();
			jfPrix.setText(produit.getPrix() + "");
			jfPrix.setEditable(edit);
		}
		return jfPrix;
	}

	public JPanel getJpdetail()
	{
		if (jpdetail == null)
		{
			jpdetail = new JPanel();
			GroupLayout gl = new GroupLayout(jpdetail);
			jpdetail.setLayout(gl);
			gl.setAutoCreateContainerGaps(true);
			gl.setAutoCreateGaps(true);

			GroupLayout.SequentialGroup horizon = gl.createSequentialGroup();
			gl.setHorizontalGroup(horizon);

			Group groupeLabels = gl.createParallelGroup();
			groupeLabels.addComponent(getJlTitre(), LARG, LARG, LARG);
			groupeLabels.addComponent(getJlPrix(), LARG, LARG, LARG);
			groupeLabels.addComponent(getJlRealisateur(), LARG, LARG, LARG);
			groupeLabels.addComponent(getJlActeurs(), LARG, LARG, LARG);
			groupeLabels.addComponent(getJlDateSortie(), LARG, LARG, LARG);

			if (produit instanceof Dvd)
			{

				groupeLabels.addComponent(getJlPays(), LARG, LARG, LARG);
				groupeLabels.addComponent(getJlFormatAud(), LARG, LARG, LARG);
				groupeLabels.addComponent(getJlFormatVid(), LARG, LARG, LARG);
				groupeLabels.addComponent(getJlCodeBarre(), LARG, LARG, LARG);
				groupeLabels.addComponent(getJlEditeur(), LARG, LARG, LARG);
				groupeLabels.addComponent(getJlDuree(), LARG, LARG, LARG);

			}
			else if (produit instanceof Affiche)
			{

				groupeLabels.addComponent(getJlFormat(), LARG, LARG, LARG);

			}
			horizon.addGroup(groupeLabels);

			Group groupeTextField = gl.createParallelGroup();
			groupeTextField.addComponent(getJfTitre(), LARGJTF, LARGJTF,
					LARGJTF);
			groupeTextField
					.addComponent(getJfPrix(), LARGJTF, LARGJTF, LARGJTF);
			groupeTextField.addComponent(getJfRealisateur(), LARGJTF, LARGJTF,
					LARGJTF);
			groupeTextField.addComponent(getJspActeurs(), LARGJTF, LARGJTF,
					LARGJTF);
			if (edit)
			{
				groupeTextField.addComponent(getJpBoutonsActeurs());
			}
			groupeTextField.addComponent(getJfDateSortie(), LARGJTF, LARGJTF,
					LARGJTF);

			if (produit instanceof Dvd)
			{

				groupeTextField.addComponent(getJfPays(), LARGJTF, LARGJTF,
						LARGJTF);
				groupeTextField.addComponent(getJfFormatAud(), LARGJTF,
						LARGJTF, LARGJTF);
				groupeTextField.addComponent(getJfFormatVid(), LARGJTF,
						LARGJTF, LARGJTF);
				groupeTextField.addComponent(getJfCodeBarre(), LARGJTF,
						LARGJTF, LARGJTF);
				groupeTextField.addComponent(getJfEditeur(), LARGJTF, LARGJTF,
						LARGJTF);
				groupeTextField.addComponent(getJfDuree(), LARGJTF, LARGJTF,
						LARGJTF);
			}

			if (produit instanceof Affiche)
			{

				groupeTextField.addComponent(getJfFormat(), LARGJTF, LARGJTF,
						LARGJTF);

			}

			// groupeTextField.addComponent(getJbOk(), LARG, LARG, LARG);

			horizon.addGroup(groupeTextField);

			// horizon.addComponent(getJbOk());

			GroupLayout.SequentialGroup vertical = gl.createSequentialGroup();
			gl.setVerticalGroup(vertical);

			Group groupeTitre = gl.createParallelGroup();
			groupeTitre.addComponent(getJlTitre(), HAUT, HAUT, HAUT);
			groupeTitre.addComponent(getJfTitre(), HAUT, HAUT, HAUT);
			vertical.addGroup(groupeTitre);

			Group groupePrix = gl.createParallelGroup();
			groupePrix.addComponent(getJlPrix(), HAUT, HAUT, HAUT);
			groupePrix.addComponent(getJfPrix(), HAUT, HAUT, HAUT);
			vertical.addGroup(groupePrix);

			Group groupeRealisateur = gl.createParallelGroup();
			groupeRealisateur
					.addComponent(getJlRealisateur(), HAUT, HAUT, HAUT);
			groupeRealisateur
					.addComponent(getJfRealisateur(), HAUT, HAUT, HAUT);
			vertical.addGroup(groupeRealisateur);

			Group groupeActeurs = gl.createParallelGroup();
			groupeActeurs.addComponent(getJlActeurs(), HAUT, HAUT, HAUT);
			groupeActeurs.addComponent(getJspActeurs());
			vertical.addGroup(groupeActeurs);
			if (edit)
			{
				vertical.addComponent(getJpBoutonsActeurs());
			}

			Group groupeDateSortie = gl.createParallelGroup();
			groupeDateSortie.addComponent(getJlDateSortie(), HAUT, HAUT, HAUT);
			groupeDateSortie.addComponent(getJfDateSortie(), HAUT, HAUT, HAUT);
			vertical.addGroup(groupeDateSortie);

			if (produit instanceof Dvd)
			{

				Group groupePays = gl.createParallelGroup();
				groupePays.addComponent(getJlPays(), HAUT, HAUT, HAUT);
				groupePays.addComponent(getJfPays(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupePays);

				Group groupeFormatAud = gl.createParallelGroup();
				groupeFormatAud
						.addComponent(getJlFormatAud(), HAUT, HAUT, HAUT);
				groupeFormatAud
						.addComponent(getJfFormatAud(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupeFormatAud);

				Group groupeFormatVid = gl.createParallelGroup();
				groupeFormatVid
						.addComponent(getJlFormatVid(), HAUT, HAUT, HAUT);
				groupeFormatVid
						.addComponent(getJfFormatVid(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupeFormatVid);

				Group groupeCodeBarre = gl.createParallelGroup();
				groupeCodeBarre
						.addComponent(getJlCodeBarre(), HAUT, HAUT, HAUT);
				groupeCodeBarre
						.addComponent(getJfCodeBarre(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupeCodeBarre);

				Group groupeEditeur = gl.createParallelGroup();
				groupeEditeur.addComponent(getJlEditeur(), HAUT, HAUT, HAUT);
				groupeEditeur.addComponent(getJfEditeur(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupeEditeur);

				Group groupeDuree = gl.createParallelGroup();
				groupeDuree.addComponent(getJlDuree(), HAUT, HAUT, HAUT);
				groupeDuree.addComponent(getJfDuree(), HAUT, HAUT, HAUT);
				vertical.addGroup(groupeDuree);

			}

			else if (produit instanceof Affiche)
			{

				Group groupeFormat = gl.createParallelGroup();
				groupeFormat.addComponent(getJlFormat(), HAUT, HAUT, HAUT);
				groupeFormat.addComponent(getJfFormat(), HAUT, HAUT, HAUT);

				vertical.addGroup(groupeFormat);

			}

		}
		return jpdetail;
	}

	public JLabel getJlRealisateur()
	{
		if (jlRealisateur == null)
		{
			jlRealisateur = new JLabel("Réalisateur");
		}
		return jlRealisateur;
	}

	public JLabel getJlDateSortie()
	{
		if (jlDateSortie == null)
		{
			jlDateSortie = new JLabel("Date de sortie(dd/mm/yyyy)");
		}
		return jlDateSortie;
	}

	public JTextField getJfRealisateur()
	{
		if (jfRealisateur == null)
		{
			jfRealisateur = new JTextField();
			jfRealisateur.setText(produit.getRealisateur());
			jfRealisateur.setEditable(edit);
		}
		return jfRealisateur;
	}

	public JFormattedTextField getJfDateSortie()
	{
		if (jfDateSortie == null)
		{
			DateFormatter df = new DateFormatter();
			SimpleDateFormat dformat = new SimpleDateFormat("dd/MM/yyyy");
			df.setFormat(dformat);
			jfDateSortie = new JFormattedTextField(df);
			jfDateSortie.setText(produit.getDateSortie());
			jfDateSortie.setEditable(edit);
		}
		return jfDateSortie;
	}

	public JButton getJbOk()
	{
		if (jbOk == null)
		{
			jbOk = new JButton("Ok");

			jbOk.addActionListener(new ActionListener()
			{

				public void actionPerformed(ActionEvent event)
				{
					if (edit)
					{
						double prix = 0;
						int duree = 0;

						// vérification du prix
						try
						{
							prix = Double.parseDouble(getJfPrix().getText());
						}
						catch (NumberFormatException e)
						{
							JOptionPane.showMessageDialog(FrameDetail.this,
									"Prix incorrect!", "Erreur",
									JOptionPane.ERROR_MESSAGE);
							return;
						}
						if (prix < 0)
						{
							JOptionPane.showMessageDialog(FrameDetail.this,
									"Prix incorrect!", "Erreur",
									JOptionPane.ERROR_MESSAGE);
							return;
						}

						if (produit instanceof Dvd)
						{
							// vérification de la durée
							try
							{
								duree = Integer
										.parseInt(getJfDuree().getText());
							}
							catch (NumberFormatException e)
							{
								JOptionPane.showMessageDialog(FrameDetail.this,
										"Durée incorrecte!", "Erreur",
										JOptionPane.ERROR_MESSAGE);
								return;
							}
							if (duree < 0)
							{
								JOptionPane.showMessageDialog(FrameDetail.this,
										"Durée incorrecte!", "Erreur",
										JOptionPane.ERROR_MESSAGE);
								return;
							}
						}

						produit.setTitre(getJfTitre().getText());

						produit.setPrix(prix);

						produit.setRealisateur(getJfRealisateur().getText());
						produit.setDateSortie(getJfDateSortie().getText());

						if (produit instanceof Dvd)
						{
							Dvd dvd = (Dvd) produit;

							dvd.setFormatAud(getJfFormatAud().getText());
							dvd.setFormatVid(getJfFormatVid().getText());
							dvd.setPays(getJfPays().getText());
							dvd.setCodeBarre(getJfCodeBarre().getText());
							dvd.setEditeur(getJfEditeur().getText());

							dvd.setDuree(duree);
						}
						else if (produit instanceof Affiche)
						{
							((Affiche) produit).setFormat(getJfFormat()
									.getText());
						}
					}

					produit.notifyObservers();
					FrameDetail.this.dispose();
				}
			});
		}
		return jbOk;
	}

	public JLabel getJlActeurs()
	{
		if (jlActeurs == null)
		{
			jlActeurs = new JLabel("Acteurs");
		}
		return jlActeurs;
	}

	public JList getJlsListeActeurs()
	{
		if (jlsListeActeurs == null)
		{
			jlsListeActeurs = new JList(produit.getActeurs().toArray());
		}
		return jlsListeActeurs;
	}

	public JLabel getJlPays()
	{
		if (jlPays == null)
		{
			jlPays = new JLabel("Pays");
		}
		return jlPays;
	}

	public JLabel getJlFormatAud()
	{
		if (jlFormatAud == null)
		{
			jlFormatAud = new JLabel("Format Audio");
		}
		return jlFormatAud;
	}

	public JLabel getJlFormatVid()
	{
		if (jlFormatVid == null)
		{
			jlFormatVid = new JLabel("Format Vidéo");
		}
		return jlFormatVid;
	}

	public JLabel getJlCodeBarre()
	{
		if (jlCodeBarre == null)
		{
			jlCodeBarre = new JLabel("Code Barre");
		}
		return jlCodeBarre;
	}

	public JLabel getJlEditeur()
	{
		if (jlEditeur == null)
		{
			jlEditeur = new JLabel("Editeur");
		}
		return jlEditeur;
	}

	public JLabel getJlDuree()
	{
		if (jlDuree == null)
		{
			jlDuree = new JLabel("Durée (min)");
		}
		return jlDuree;
	}

	public JTextField getJfPays()
	{
		if (jfPays == null)
		{
			jfPays = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfPays.setText(dvd.getPays());
			jfPays.setEditable(edit);
		}
		return jfPays;
	}

	public JTextField getJfFormatAud()
	{
		if (jfFormatAud == null)
		{
			jfFormatAud = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfFormatAud.setText(dvd.getFormatAud());
			jfFormatAud.setEditable(edit);
		}
		return jfFormatAud;
	}

	public JTextField getJfFormatVid()
	{
		if (jfFormatVid == null)
		{
			jfFormatVid = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfFormatVid.setText(dvd.getFormatVid());
			jfFormatVid.setEditable(edit);
		}
		return jfFormatVid;
	}

	public JTextField getJfCodeBarre()
	{
		if (jfCodeBarre == null)
		{
			jfCodeBarre = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfCodeBarre.setText(dvd.getCodeBarre());
			jfCodeBarre.setEditable(edit);
		}
		return jfCodeBarre;
	}

	public JTextField getJfEditeur()
	{
		if (jfEditeur == null)
		{
			jfEditeur = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfEditeur.setText(dvd.getEditeur());
			jfEditeur.setEditable(edit);
		}
		return jfEditeur;
	}

	public JTextField getJfDuree()
	{
		if (jfDuree == null)
		{
			jfDuree = new JTextField();
			Dvd dvd = (Dvd) produit;
			jfDuree.setText(dvd.getDuree() + "");
			jfDuree.setEditable(edit);
		}
		return jfDuree;
	}

	public JLabel getJlFormat()
	{
		if (jlFormat == null)
		{
			jlFormat = new JLabel("Format");
		}
		return jlFormat;
	}

	public JTextField getJfFormat()
	{
		if (jfFormat == null)
		{
			jfFormat = new JTextField();
			Affiche af = (Affiche) produit;
			jfFormat.setText(af.getFormat());
			jfFormat.setEditable(edit);
		}
		return jfFormat;
	}

	public JButton getJbAjouterActeur()
	{
		if (jbAjouterActeur == null)
		{
			jbAjouterActeur = new JButton("Ajouter");
			jbAjouterActeur.addActionListener(new ActionListener()
			{
				@Override
				public void actionPerformed(ActionEvent event)
				{
					String input = JOptionPane.showInputDialog(
							FrameDetail.this, "Entrez le nom de l'acteur");
					if (input != null)
					{
						try
						{
							produit.ajouterActeur(input);
							getJlsListeActeurs().setListData(
									produit.getActeurs().toArray());
						}
						catch (DoublonException e)
						{
							JOptionPane.showMessageDialog(FrameDetail.this,
									e.getMessage(), "Erreur",
									JOptionPane.ERROR_MESSAGE);
						}
					}
				}
			});
		}
		return jbAjouterActeur;
	}

	public JButton getJbSupprimerActeur()
	{
		if (jbSupprimerActeur == null)
		{
			jbSupprimerActeur = new JButton("Supprimer");
			jbSupprimerActeur.addActionListener(new ActionListener()
			{
				@Override
				public void actionPerformed(ActionEvent e)
				{
					int index = getJlsListeActeurs().getSelectedIndex();
					if (index > -1)
					{
						produit.supprimerActeur((String) getJlsListeActeurs()
								.getModel().getElementAt(index));
						getJlsListeActeurs().setListData(
								produit.getActeurs().toArray());
					}
				}
			});
			jbSupprimerActeur.setEnabled(false);
			getJlsListeActeurs().getSelectionModel().addListSelectionListener(
					new ListSelectionListener()
					{
						@Override
						public void valueChanged(ListSelectionEvent event)
						{
							if (getJlsListeActeurs().getSelectedIndex() > -1)
							{
								jbSupprimerActeur.setEnabled(true);
							}
							else
							{
								jbSupprimerActeur.setEnabled(false);
							}
						}
					});
		}
		return jbSupprimerActeur;
	}

	public JScrollPane getJspActeurs()
	{
		if (jspActeurs == null) jspActeurs = new JScrollPane(
				getJlsListeActeurs());
		return jspActeurs;
	}

	public JPanel getJpBoutonsActeurs()
	{
		if (jpBoutonsActeurs == null)
		{
			jpBoutonsActeurs = new JPanel();
			jpBoutonsActeurs.setLayout(new FlowLayout());
			jpBoutonsActeurs.add(getJbAjouterActeur());
			jpBoutonsActeurs.add(getJbSupprimerActeur());
		}
		return jpBoutonsActeurs;
	}
}
